package com.oha.laporrayelchurro.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.oha.laporrayelchurro.dao.PartidoDao;
import com.oha.laporrayelchurro.model.Partido;

public class PartidoService extends XlsService{
	
	private static Logger log4j = Logger.getLogger(PartidoService.class);
	
	/**
	 * 
	 * @return
	 */
	public List<Partido> getPartidos(String xlsFile){
		List<Partido> pList = new ArrayList<Partido>();
		try {
			Sheet sheet = getSheet(xlsFile);
			pList.addAll(getPartidos16(pList.size()+1, sheet));
			pList.addAll(getPartidos8(pList.size()+1, sheet));
			pList.addAll(getPartidos4(pList.size()+1, sheet));
			pList.addAll(getPartidos3(pList.size()+1, sheet));
			pList.addAll(getPartidos2(pList.size()+1, sheet));
			pList.addAll(getPartidos1(pList.size()+1, sheet));
		} catch (InvalidFormatException | IOException e) {
			log4j.error("InvalidFormatException | IOException.getPartidos.", e);
		}
		return pList;
	}
	

	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos16(int nPartido, Sheet sheet){
		int rowIni=12;
		int rowEnd=75;
		int colIni=4;
		int colEnd=9;
		String[] gruposStr = new String[]{"A","B", "C", "D", "E", "F", "G", "H"};
		int grupo=0;
		int indexG = 0;
		List<Partido> partidoLst = new ArrayList<Partido>();
		for(int nrow =rowIni; nrow<rowEnd; nrow ++){
			Row row = sheet.getRow(nrow);
			Partido partido = new Partido();
			for(int col=colIni; col<colEnd; col++){
				Cell cell = row.getCell(col);
				int cellType = row.getCell(col).getCellType();
				if(col==4){
					partido.setHora(cell.getDateCellValue());
				}else if(col==5 && (cellType==1 || cellType==2)){//String
					partido.setPais1(cell.getStringCellValue());
				}else if(col==6){
					
				}else if(col==7){
					
				}else if(col==8){
					partido.setPais2(cell.getStringCellValue());
				}
			}
			grupo++;
			partido.setTipo(16);
			partido.setGrupo(gruposStr[indexG]);
			partido.setOrden(nPartido++);
			partidoLst.add(partido);
			if(grupo>=6){
				grupo=0;
				nrow+=2;
				indexG++;
			}
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos8(int nPartido, Sheet sheet){
		int step = 4;
		List<Partido> partidoLst = new ArrayList<Partido>();
		for(int nrow=13; nrow<42; nrow+=step){
			Partido partido = new Partido();
			Cell cell = sheet.getRow(nrow+1).getCell(21);
			partido.setHora(cell.getDateCellValue());
			
			cell = sheet.getRow(nrow).getCell(23);
			partido.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			partido.setPais2(cell.getStringCellValue());
			
			partido.setTipo(8);
			partido.setGrupo("8");
			partido.setOrden(nPartido++);
			partidoLst.add(partido);
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos4(int nPartido, Sheet sheet){
		int step = 4;
		List<Partido> partidoLst = new ArrayList<Partido>();
		for(int nrow=46; nrow<59; nrow+=step){
			Partido partido = new Partido();
			Cell cell = sheet.getRow(nrow+1).getCell(21);
			partido.setHora(cell.getDateCellValue());
			
			cell = sheet.getRow(nrow).getCell(23);
			partido.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			partido.setPais2(cell.getStringCellValue());
			
			partido.setTipo(4);
			partido.setGrupo("4");
			partido.setOrden(nPartido++);
			partidoLst.add(partido);
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos3(int nPartido, Sheet sheet){
		int step = 4;
		List<Partido> partidoLst = new ArrayList<Partido>();
		for(int nrow=63; nrow<68; nrow+=step){
			Partido partido = new Partido();
			Cell cell = sheet.getRow(nrow+1).getCell(21);
			partido.setHora(cell.getDateCellValue());
			
			cell = sheet.getRow(nrow).getCell(23);
			partido.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			partido.setPais2(cell.getStringCellValue());
			
			partido.setTipo(3);
			partido.setGrupo("3");
			partido.setOrden(nPartido++);
			partidoLst.add(partido);
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos2(int nPartido, Sheet sheet){
		int step = 4;
		List<Partido> partidoLst = new ArrayList<Partido>();
		for(int nrow=72; nrow<74; nrow+=step){
			Partido partido = new Partido();
			Cell cell = sheet.getRow(nrow+1).getCell(21);
			partido.setHora(cell.getDateCellValue());
			
			cell = sheet.getRow(nrow).getCell(23);
			partido.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			partido.setPais2(cell.getStringCellValue());
			
			partido.setTipo(2);
			partido.setGrupo("2");
			partido.setOrden(nPartido++);
			partidoLst.add(partido);
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @return
	 */
	private List<Partido> getPartidos1(int nPartido, Sheet sheet){
		List<Partido> partidoLst = new ArrayList<Partido>();
		Partido partido = new Partido();
		Cell cell = sheet.getRow(78).getCell(21);
		partido.setHora(cell.getDateCellValue());
		
		cell = sheet.getRow(77).getCell(23);
		partido.setPais1(cell.getStringCellValue());
		cell = sheet.getRow(78).getCell(23);
		partido.setPais2(cell.getStringCellValue());
		
		partido.setTipo(1);
		partido.setGrupo("1");
		partido.setOrden(nPartido++);
		partidoLst.add(partido);
		return partidoLst;
	}
	
	/**
	 * elimina la tabla y la vuelve a crear.
	 */
	public void resetTable(){
		PartidoDao partidoDao = new PartidoDao();
		partidoDao.resetTable();
	}
	
}
